第 372 场力扣周赛

使三个字符串相等

等价于求字符串的最长公共前缀。

1
2
3
4
5
6
7
8
9
10
class Solution {
public int findMinimumOperations(String s1, String s2, String s3) {
int n = Math.min(s1.length(), Math.min(s2.length(), s3.length()));
int i = 0;
while (i < n && s1.charAt(i) == s2.charAt(i) && s2.charAt(i) == s3.charAt(i)) {
i++;
}
return i == 0 ? -1 : s1.length() + s2.length() + s3.length() - 3 * i;
}
}

区分黑球与白球

将每个 \(1\) 右边 \(0\) 的个数累加就是需要交换的次数,或者累加每个 \(0\) 左边 \(1\) 的个数也行。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public long minimumSteps(String s) {
long ans = 0L;
int n = s.length(), cnt = 0;
for (int i = n - 1; i >= 0; i--) {
if (s.charAt(i) == '0') cnt++;
else ans += cnt;
}
return ans;
}
}

最大异或乘积

要求 \(\max((a\oplus x)\times(b\oplus x))\),可以得出异或只会在两者都为 \(0\) 的位上补 \(1\),或者交换两者某位上的 \(0\) 和 \(1\)。此时 \((a\oplus x)+(b\oplus x)=c\),\(c\) 为某个定值,从而问题可以转化为求函数 \(y=x(c-x)\) 的最大值,可以知道当 \(x=\frac{c}{2}\) 时取到最大值,即我们需要让 \((a\oplus x)\) 和 \((b\oplus x)\) 尽可能相等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
private static final int MOD = (int) 1e9 + 7;

public int maximumXorProduct(long a, long b, int n) {
long p = a >> n << n, q = b >> n << n;
for (int i = n - 1; i >= 0; i--) {
if ((a >> i & 1) == (b >> i & 1)) {
p |= 1L << i;
q |= 1L << i;
} else if (p < q) {
p |= 1L << i;
} else {
q |= 1L << i;
}
}
return (int) (p % MOD * (q % MOD) % MOD);
}
}

找到 Alice 和 Bob 可以相遇的建筑

离线查询,可以预处理查询序列,然后使用单调栈 + 二分,或者使用最小堆;在线查询,可以使用线段树(暂时不学)。

作者

Ligh0x74

发布于

2023-11-20

更新于

2023-11-20

许可协议

评论